package Spectrum

func GetScreenIntegerFFTData(
	plotHeight, plotWidth int32,
	maxdB, mindB float32,
	startFreq, stopFreq int64, // Hz！原版就是 Hz
	sampleFreq float32, // Hz！你的 20e6
	fftData []float32, // length = 16384，已是 dB 值
	outBuf []float32, // 预分配好 plotWidth 长度的缓冲区
) (xmin, xmax int32) {

	fftSize := int32(len(fftData))
	if fftSize == 0 || plotWidth == 0 || len(outBuf) < int(plotWidth) {
		return 0, 0
	}

	// 清零输出缓冲区（原版没清，但实际使用场景前端会覆盖，这里建议清一下防万一）
	for i := range outBuf[:plotWidth] {
		outBuf[i] = 0.0
	}
	plotHeight = 500
	dBGainFactor := float32(1) //float32(plotHeight) / float32(math.Abs(float64(maxdB-mindB)))

	// 计算频率对应的 bin（注意：原版是循环谱，中心频率对应 bin = fftSize/2）
	binMin := int32(float64(startFreq) * float64(fftSize) / float64(sampleFreq))
	binMin += fftSize / 2
	binMax := int32(float64(stopFreq) * float64(fftSize) / float64(sampleFreq))
	binMax += fftSize / 2

	// 边界修正（和原版完全一致）
	minbin := binMin
	if minbin < 0 {
		minbin = 0
	}
	if binMin >= fftSize {
		binMin = fftSize - 1
	}
	if binMax <= binMin {
		binMax = binMin + 1
	}
	maxbin := binMax
	if maxbin > fftSize {
		maxbin = fftSize
	}

	largeFFT := (binMax - binMin) > plotWidth

	// 预分配 translate table（和原版一样用最大值）
	translateTbl := make([]int32, maxInt32(fftSize, plotWidth))

	if largeFFT {
		// FFT 点多 → 多个 bin 对应一个 x
		for i := minbin; i < maxbin; i++ {
			translateTbl[i] = int32((int64(i-binMin) * int64(plotWidth)) / int64(binMax-binMin))
		}
		xmin = translateTbl[minbin]
		xmax = translateTbl[maxbin-1]
	} else {
		// 屏幕点多 → 插值
		step := binMax - binMin
		for x := int32(0); x < plotWidth; x++ {
			translateTbl[x] = binMin + int32((int64(x)*int64(step))/int64(plotWidth))
		}
		xmin = 0
		xmax = plotWidth - 1
	}

	// 主循环：和原版一模一样
	if largeFFT {
		// 峰值保持模式（关键！）
		var xPrev int32 = -1
		ymax := int32(10000)

		for i := minbin; i < maxbin; i++ {
			val := -fftData[i%fftSize] // 安全取模，防越界（原版没这层但实际不会越）
			y := int32(dBGainFactor * (maxdB - val))

			if y > plotHeight {
				y = plotHeight
			} else if float32(y) < mindB {
				y = int32(mindB)
			}

			x := translateTbl[i]

			if x == xPrev {
				if y < ymax { // 注意：取最强（y最小 = 最上面）
					outBuf[x] = float32(y)
					ymax = y
				}
			} else {
				outBuf[x] = float32(y)
				xPrev = x
				ymax = y
			}
		}
	} else {
		// 简单复制模式
		for x := int32(0); x < plotWidth; x++ {
			i := translateTbl[x]
			var y int32
			if i < 0 || i >= fftSize {
				y = plotHeight
			} else {
				y = int32(dBGainFactor * (maxdB + fftData[i]))
			}
			if y > plotHeight {
				y = plotHeight
			} else if float32(y) < mindB {
				y = 0
			}
			outBuf[x] = float32(y)
		}
	}

	return xmin, xmax
}

// 辅助函数
func maxInt32(a, b int32) int32 {
	if a > b {
		return a
	}
	return b
}
